我在清理專案追蹤檔案時,遇到一個看似簡單的 Git 指令,卻意外觸發了一連串關於編碼與路徑的問題。
原本打算透過這行指令,快速忽略 .gitignore
中標記過但仍被追蹤的檔案:
git ls-files -ci --exclude-from=.gitignore | ForEach-Object { git update-index --assume-unchanged $_ }
結果遇到一堆 fatal 錯誤,顯示某些檔案無法標記為不變更。這些錯誤,多半集中在含有中文路徑或奇怪符號的檔案上。
問題狀況 | 解法建議 |
---|---|
PowerShell 無法正確處理 Git 輸出的中文編碼 | 明確設定 $OutputEncoding = [System.Text.Encoding]::UTF8 ,或改用 Git Bash 處理管線 |
fatal: Unable to mark file | 很可能是檔名過長、非法字元,或是 Windows 不支援的 NTFS 組合字元 |
merge 後分支被 GitLab 自動刪除 | 不是 Maintainer 時,合併時請取消「Delete source branch」選項,或手動備份分支 |
Draft Merge Request 不會保留分支? | Draft 只會阻止提前合併,並不會阻止合併後刪除分支行為 |
$OutputEncoding = [System.Text.Encoding]::UTF8
git ls-files -ci --exclude-from=.gitignore
git ls-files -ci --exclude-from=.gitignore | xargs -I{} git update-index --assume-unchanged "{}"
git ls-files -ci --exclude-from=.gitignore | while read file; do
echo "處理中:$file"
git update-index --assume-unchanged "$file" || echo "⚠️ 無法處理:$file"
done
git checkout -b LSG-backup
LSG-backup-$(Get-Date -Format yyyyMMddHHmm)
在 GitLab 建立 Merge Request(MR)時,若尚未完成開發,建議將標題開頭加上:
Draft: 新功能開發中
WIP: 尚在調整,不可合併
行為 | 結果 |
---|---|
標題含 Draft: 或 WIP: | GitLab 將禁止合併,Merge 按鈕呈現灰色 |
CI/CD 測試 | 仍可正常執行 |
Review 留言與討論 | 仍可進行 |
想解除 Draft 狀態 | 只要修改標題,刪除 Draft: 前綴即可 |
📌 這是團隊內溝通「我還沒準備好合併」的非語言提示。也可以搭配 Review 流程,避免提早被他人合併,造成 branch 遺失風險。
當我使用 git ls-files 搭配 --exclude-from=.gitignore 遇到中文檔名亂碼,要怎麼解決?
如何判斷 git update-index 失敗的原因是編碼、檔名過長,還是 Windows 不支援?
我在 GitLab 被自動刪除分支,但我不是專案 Maintainer,有什麼方式可以避免?